package edu.uoc.tdp.servidor.bbdd.conexio;

import edu.uoc.tdp.bbdd.GestorDiscConnexio;
import edu.uoc.tdp.beans.conexio.Administrador;
import edu.uoc.tdp.beans.conexio.Estudiant;
import edu.uoc.tdp.beans.conexio.ResponsableEvents;
import edu.uoc.tdp.beans.conexio.Usuari;
import edu.uoc.tdp.common.EOlympicsException;
import edu.uoc.tdp.common.EOlympicsExceptionConnexio;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Classe GestorAcces
 * TDP Grup TDP 1X4J
 */
public class GestorAcces {
    
    private GestorDiscConnexio gestor;
    private Connection connexio;

    /**
     * Constructor de la classe Gestora
     * Crea un nou gestor de disc.
     */
    public GestorAcces() throws EOlympicsException {
        this.gestor = new GestorDiscConnexio();
        this.gestor.obreConnexioBD();
        this.connexio = gestor.getConnexio();
    }

    /**
     * Constructor de la classe Gestora
     * Utilitza el gestor de disc passat com a paràmetre
     * @param gdc connexió a la BD de tipus GestorDiscConnexio
     */
    public GestorAcces(GestorDiscConnexio gdc) {
        this.gestor   = gdc;
        this.connexio = gdc.getConnexio();
    }
    
    
    /**
     * Consulta d'un Usuari pel seu Identificador i contrassenya
     * @param pIdUsuari Identificador de l'Usuari
     * @param pPwd Contrassenya de l'Usuari
     * @return objecte Usuari d'identificador i contrassenya iguals als passats com a paràmete
     * @exception EOlympicsException
     */
    public Usuari obtenirUsuari(String pIdUsuari, String pPwd) throws EOlympicsException {
        Usuari usu = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT idIntern, idUsuari, pwd, email, " +
                "tipusDocumentId, document, nom, cognom1, cognom2, estatEnSistema " +
                "FROM USUARI " + 
                "WHERE idUsuari = '" + pIdUsuari + "'";
        
        if (!pPwd.isEmpty()) 
          select = select + " AND pwd = '" + pPwd + "'";
          
        select = select + " AND dataBaixa IS NULL;";
        
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                usu = new Usuari(rs.getInt(1), rs.getString(2),
                        rs.getString(3), rs.getString(4),
                        rs.getString(5), rs.getString(6),
                        rs.getString(7), rs.getString(8),
                        rs.getString(9), rs.getString(10));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return usu;
    }
    
    /**
     * Bloqueig accés d'un Usuari pel seu Identificador intern
     * @param pIdIntern Identificador intern de l'Usuari
     * @return true si l'actualització de l'estat de l'ususari s'ha fet
     * @exception EOlympicsException
     */
    public boolean bloquejarUsuari(int pIdIntern) throws EOlympicsExceptionConnexio {
        boolean ok = false;

        String stUpd = "UPDATE USUARI SET estatEnSistema = 'B'" +
                       " WHERE idIntern = " + pIdIntern;

        try {
            Statement sentencia = gestor.creaSentencia();
            sentencia.executeUpdate(stUpd);
            ok = true;
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsExceptionConnexio(EOlympicsExceptionConnexio.ERR_SQL_BLOQUSU);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsExceptionConnexio(EOlympicsExceptionConnexio.ERR_DESC_EXEC_BLOQUSU);
        }
        return ok;
    }
    

    /**
     * Consulta d'un Administrador pel seu Identificador i contrassenya
     * @param pIdAdmin Identificador de l'Administrador
     * @param pPwd Contrassenya de l'Administrador
     * @return objecte Administrador d'identificador i contrassenya iguals als passats com a paràmete
     * @exception EOlympicsException
     */
    public Administrador obtenirAdministrador(String pIdAdmin, String pPwd) throws EOlympicsException {
        Administrador adm = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT u.idIntern, u.idUsuari, u.pwd, u.email, " +
                "u.tipusDocumentId, u.document, u.nom, u.cognom1, u.cognom2, u.estatEnSistema " +
                "FROM ADMINISTRADOR as a, USUARI as u " + 
                "WHERE u.idUsuari = '" + pIdAdmin + "'" +
                " AND u.pwd = '" + pPwd + "'" +
                " AND u.tipusUsuari = 'A'" +
                " AND u.dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                adm = new Administrador(rs.getInt(1), rs.getString(2),
                        rs.getString(3), rs.getString(4),
                        rs.getString(5), rs.getString(6),
                        rs.getString(7), rs.getString(8),
                        rs.getString(9), rs.getString(10));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return adm;
    }
    
     /**
     * Consulta d'un Responsable d'events pel seu Identificador i contrassenya
     * @param pIdRespEv Identificador del Responsable d'events
     * @param pPwd Contrassenya del Responsable d'events
     * @return objecte ResponsableEvents d'identificador i contrassenya iguals als passats com a paràmete
     * @exception EOlympicsException
     */
    public ResponsableEvents obtenirResponsableEvents(String pIdRespEv, String pPwd) throws EOlympicsException {
        ResponsableEvents REv = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT u.idIntern, u.idUsuari, u.pwd, u.email, " +
                "u.tipusDocumentId, u.document, u.nom, u.cognom1, u.cognom2, u.estatEnSistema " +
                "FROM RESPONSABLEEVENTS as r, USUARI as u " + 
                "WHERE u.idUsuari = '" + pIdRespEv + "'" +
                " AND u.pwd = '" + pPwd + "'" +
                " AND u.tipusUsuari = 'R'" +
                " AND dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                REv = new ResponsableEvents(rs.getInt(1), rs.getString(2),
                        rs.getString(3), rs.getString(4),
                        rs.getString(5), rs.getString(6),
                        rs.getString(7), rs.getString(8),
                        rs.getString(9), rs.getString(10));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return REv;
    }
    
   /**
     * Consulta d'un Estudiant pel seu Identificador i contrassenya
     * @param pIdEst Identificador de l'Estudiant
     * @param pPwd Contrassenya de l'Estudiant
     * @return objecte Estudiant d'identificador i contrassenya iguals als passats com a paràmete
     * @exception EOlympicsException
     */
    public Estudiant obtenirEstudiant(String pIdEst, String pPwd) throws EOlympicsException {
        Estudiant est = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT  u.idIntern, e.universitat, u.idUsuari, u.pwd, u.email, "
                + "u.tipusDocumentId, u.document, u.nom, u.cognom1, u.cognom2, u.estatEnSistema "
                + "FROM ESTUDIANT as e, USUARI as u "
                + "WHERE u.idUsuari = '" + pIdEst + "'"
                + " AND u.pwd = '" + pPwd + "'"
                + " AND u.tipusUsuari = 'E'"
                + " AND dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                est = new Estudiant(rs.getInt(1), rs.getString(2),
                        rs.getString(3), rs.getString(4),
                        rs.getString(5), rs.getString(6),
                        rs.getString(7), rs.getString(8),
                        rs.getString(9), rs.getString(10),
                        rs.getString(11));
            }
            rs.close();
            sentencia.close();
            
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return est;
    }

}
